package pers.sloera.leetcode.editor.cn;//给定两个以字符串形式表示的非负整数 num1 和 num2，返回 num1 和 num2 的乘积，它们的乘积也表示为字符串形式。
//
// 注意：不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 
//
// 
//
// 示例 1: 
//
// 
//输入: num1 = "2", num2 = "3"
//输出: "6" 
//
// 示例 2: 
//
// 
//输入: num1 = "123", num2 = "456"
//输出: "56088" 
//
// 
//
// 提示： 
//
// 
// 1 <= num1.length, num2.length <= 200 
// num1 和 num2 只能由数字组成。 
// num1 和 num2 都不包含任何前导零，除了数字0本身。 
// 
// Related Topics 数学 字符串 模拟 👍 878 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution43 {
    public String multiply(String num1, String num2) {
        int[] result = new int[num1.length() + num2.length()];
        for (int i = num1.length() - 1; i >= 0; i--) {
            for (int j = num2.length() - 1; j >= 0; j--) {
                final char left = num1.charAt(i);
                final char right = num2.charAt(j);
                final int i1 = Integer.parseInt(left + "") * Integer.parseInt(right + "");
                handleCarry(result, i + j + 1, i1);
            }
            handleCarry(result, i, 0);
        }
        final StringBuilder stringBuilder = new StringBuilder();
        int zeroIndex = 0;
        while (result[zeroIndex++] == 0 && zeroIndex < result.length) {
        }
        for (int i = zeroIndex - 1; i < result.length; i++) {
            stringBuilder.append(result[i]);
        }
        return stringBuilder.toString();
    }

    /**
     * 处理进位
     *
     * @return void
     * @date 2022/3/24
     */
    private static void handleCarry(int[] result, int index, int num) {
        for (int i = index; i >= 0; i--) {
            int temp = result[index] + num;
            if (temp >= 10) {
                result[index] = temp % 10;
                num = temp / 10;
                index--;
            } else {
                result[index] = temp;
                return;
            }
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)
